#pragma once

#include <set>
#include <map>
#include <vector>
#include <string>
#include "Analysis/BasicBlock.h"

class Function;
class Instruction;

/// 基于基本块和CFG的活跃变量分析器
class LivenessCFGAnalysis {
public:
    // 对函数进行活跃变量分析（传入基本块列表）
    void analyze(const std::vector<BasicBlock *> & basicBlocks);

    // 获取某条指令的活跃变量集合（in集合）
    const std::set<std::string> & getInSet(Instruction * inst) const;

    // 输出每条指令的活跃变量集合
    void printLiveness(const std::vector<BasicBlock *> & basicBlocks) const;

private:
    std::map<Instruction *, std::set<std::string>> inSets;
    std::map<Instruction *, std::set<std::string>> outSets;
};

// 注意：buildBasicBlocks声明应放在类外部
void buildBasicBlocks(const std::vector<Instruction *> & insts, std::vector<BasicBlock *> & blocks);
